slf4j、jcl、jul、log4j1、log4j2、logback大总结 |
您所在的位置:网站首页 › commons-logging 与spring-jcl冲突 › slf4j、jcl、jul、log4j1、log4j2、logback大总结 |
1 系列目录
jdk-logging、log4j、logback日志介绍及原理
commons-logging与jdk-logging、log4j1、log4j2、logback的集成原理
slf4j与jdk-logging、log4j1、log4j2、logback的集成原理
slf4j、jcl、jul、log4j1、log4j2、logback大总结
2各种jar包总结
log4j1: log4j:log4j1的全部内容log4j2: log4j-api:log4j2定义的API log4j-core:log4j2上述API的实现logback: logback-core:logback的核心包 logback-classic:logback实现了slf4j的APIcommons-logging: commons-logging:commons-logging的原生全部内容 log4j-jcl:commons-logging到log4j2的桥梁 jcl-over-slf4j:commons-logging到slf4j的桥梁slf4j转向某个实际的日志框架: 场景介绍:如 使用slf4j的API进行编程,底层想使用log4j1来进行实际的日志输出,这就是slf4j-log4j12干的事。 slf4j-jdk14:slf4j到jdk-logging的桥梁 slf4j-log4j12:slf4j到log4j1的桥梁 log4j-slf4j-impl:slf4j到log4j2的桥梁 logback-classic:slf4j到logback的桥梁 slf4j-jcl:slf4j到commons-logging的桥梁某个实际的日志框架转向slf4j: 场景介绍:如 使用log4j1的API进行编程,但是想最终通过logback来进行输出,所以就需要先将log4j1的日志输出转交给slf4j来输出,slf4j再交给logback来输出。将log4j1的输出转给slf4j,这就是log4j-over-slf4j做的事 这一部分主要用来进行实际的日志框架之间的切换(下文会详细讲解) jul-to-slf4j:jdk-logging到slf4j的桥梁 log4j-over-slf4j:log4j1到slf4j的桥梁 jcl-over-slf4j:commons-logging到slf4j的桥梁 3集成总结 3.1 commons-logging与其他日志框架集成1 commons-logging与jdk-logging集成: 需要的jar包: commons-logging2 commons-logging与log4j1集成: 需要的jar包: commons-logging log4j3 commons-logging与log4j2集成: 需要的jar包: commons-logging log4j-api log4j-core log4j-jcl(集成包)4 commons-logging与logback集成: 需要的jar包: logback-core logback-classic slf4j-api、jcl-over-slf4j(2个集成包,可以不再需要commons-logging)5 commons-logging与slf4j集成: 需要的jar包: jcl-over-slf4j(集成包,不再需要commons-logging) slf4j-api 3.2 slf4j与其他日志框架集成slf4j与jdk-logging集成: 需要的jar包: slf4j-api slf4j-jdk14(集成包)slf4j与log4j1集成: 需要的jar包: slf4j-api log4j slf4j-log4j12(集成包)slf4j与log4j2集成: 需要的jar包: slf4j-api log4j-api log4j-core log4j-slf4j-impl(集成包)slf4j与logback集成: 需要的jar包: slf4j-api logback-core logback-classic(集成包)slf4j与commons-logging集成: 需要的jar包: slf4j-api commons-logging slf4j-jcl(集成包) 4 日志系统之间的切换 4.1 log4j无缝切换到logback 4.1.1 案例我们已经在代码中使用了log4j1的API来进行日志的输出,现在想不更改已有代码的前提下,使之通过logback来进行实际的日志输出。 已使用的jar包: log4j使用案例: private static final Logger logger=Logger.getLogger(Log4jTest.class); public static void main(String[] args){ if(logger.isInfoEnabled()){ logger.info("log4j info message"); } }上述的Logger是log4j1自己的org.apache.log4j.Logger,在上述代码中,我们在使用log4j1的API进行编程 现在如何能让上述的日志输出通过logback来进行输出呢? 只需要更换一下jar包就可以: 第一步:去掉log4j jar包第二步:加入以下jar包 log4j-over-slf4j(实现log4j1切换到slf4j) slf4j-api logback-core logback-classic 第三步:在类路径下加入logback的配置文件原理是什么呢? 4.1.2 切换原理看下log4j-over-slf4j就一目了然了: 我们可以看到,这里面其实是简化更改版的log4j。去掉log4j1的原生jar包,换成该简化更改版的jar包(可以实现无缝迁移)。 但是简化更改版中的Logger和原生版中的实现就不同了,简化版中的Logger实现如下(继承了Category): public class Category { private String name; protected org.slf4j.Logger slf4jLogger; private org.slf4j.spi.LocationAwareLogger locationAwareLogger; Category(String name) { this.name = name; slf4jLogger = LoggerFactory.getLogger(name); if (slf4jLogger instanceof LocationAwareLogger) { locationAwareLogger = (LocationAwareLogger) slf4jLogger; } } }从上面可以看到简化版中的Logger内部是使用slf4j的API来生成的,所以我们使用的简化版的Logger会委托给slf4j来进行输出,由于当前类路径下有logback-classic,所以slf4j会选择logback进行输出。从而实现了log4j到logback的日志切换。 下面的内容就只讲解日志系统到slf4j的切换,不再讲解slf4j选择何种日志来输出 4.2 jdk-logging无缝切换到logback 4.2.1 案例 private static final Logger logger=Logger.getLogger(JulSlf4jLog4jTest.class.getName()); public static void main(String[] args){ logger.log(Level.INFO,"jul info a msg"); logger.log(Level.WARNING,"jul waring a msg"); }可以看到上述是使用jdk-logging自带的API来进行编程的,现在我们想这些日志交给logback来输出 解决办法如下: 第一步:加入以下jar包: jul-to-slf4j (实现jdk-logging切换到slf4j) slf4j-api logback-core logback-classic第二步:在类路径下加入logback的配置文件 第三步:在代码中加入如下代码: static{ SLF4JBridgeHandler.install();} 4.2.2 切换原理先来看下jul-to-slf4j jar包中的内容: 我们看到只有一个类:SLF4JBridgeHandler 它继承了jdk-logging中定义的java.util.logging.Handler,Handler是jdk-logging处理日志过程中的一个处理器(具体我也没仔细研究过),在使用之前,必须要提前注册这个处理器,即上述的SLF4JBridgeHandler.install()操作,install后我们就可以通过这个handler实现日志的切换工作,如下: protected Logger getSLF4JLogger(LogRecord record) { String name = record.getLoggerName(); if (name == null) { name = UNKNOWN_LOGGER_NAME; } return LoggerFactory.getLogger(name); }在处理日志的过程中,使用了slf4j的原生方式LoggerFactory来获取一个slf4j定义的Logger来进行日志的输出 而slf4j则又会选择logback来进行实际的日志输出 4.3 commons-logging切换到logback 4.3.1 使用案例使用的jar包 commons-logging案例如下: private static Log logger=LogFactory.getLog(JulJclTest.class); public static void main(String[] args){ if(logger.isTraceEnabled()){ logger.trace("commons-logging-jcl trace message"); } }可以看到我们使用commons-logging的API来进行日志的编程操作,现在想切换成logback来进行日志的输出(这其实就是commons-logging与logback的集成) 解决办法如下: 第一步:去掉commons-logging jar包(其实去不去都无所谓)第二步:加入以下jar包: jcl-over-slf4j(实现commons-logging切换到slf4j) slf4j-api logback-core logback-classic第三步:在类路径下加入logback的配置文件 4.3.2 切换原理这个原理之前都已经说过了,可以看下commons-logging与logback的集成 就是commons-logging通过jcl-over-slf4j 来选择slf4j作为底层的日志输出对象,而slf4j又选择logback来作为底层的日志输出对象。 4.4 常用的日志场景切换解释上面把日志的切换原理说清楚了,下面就针对具体的例子来进行应用 先来看下slf4j官方的一张图: 下面分别详细说明这三个案例 4.4.1 左上图现状: 目前的应用程序中已经使用了如下混杂方式的API来进行日志的编程: commons-logging log4j1 jdk-logging现在想统一将日志的输出交给logback 解决办法: 第一步:将上述日志系统全部无缝先切换到slf4j 去掉commons-logging(其实去不去都可以),使用jcl-over-slf4j将commons-logging的底层日志输出切换到slf4j 去掉log4j1(必须去掉),使用log4j-over-slf4j,将log4j1的日志输出切换到slf4j 使用jul-to-slf4j,将jul的日志输出切换到slf4j第二步:使slf4j选择logback来作为底层日志输出 加入以下jar包: slf4j-api logback-core logback-classic下面的2张图和上面就很类似 4.4.2 右上图现状: 目前的应用程序中已经使用了如下混杂方式的API来进行日志的编程: commons-logging jdk-logging现在想统一将日志的输出交给log4j1 解决办法: 第一步:将上述日志系统全部无缝先切换到slf4j 去掉commons-logging(其实去不去都可以),使用jcl-over-slf4j将commons-logging的底层日志输出切换到slf4j 使用jul-to-slf4j,将jul的日志输出切换到slf4j第二步:使slf4j选择log4j1来作为底层日志输出 加入以下jar包: slf4j-api log4j slf4j-log4j12(集成包) 4.4.3 左下图现状: 目前的应用程序中已经使用了如下混杂方式的API来进行日志的编程: commons-logging log4j现在想统一将日志的输出交给jdk-logging 解决办法: 第一步:将上述日志系统全部无缝先切换到slf4j 去掉commons-logging(其实去不去都可以),使用jcl-over-slf4j将commons-logging的底层日志输出切换到slf4j 去掉log4j1(必须去掉),使用log4j-over-slf4j,将log4j1的日志输出切换到slf4j第二步:使slf4j选择jdk-logging来作为底层日志输出 加入以下jar包: slf4j-api slf4j-jdk14(集成包) 5 冲突说明仍然是这里的内容slf4j官网的冲突说明 其实明白上面介绍的各jar包的作用,就很容易理解 5.1 jcl-over-slf4j 与 slf4j-jcl 冲突jcl-over-slf4j: commons-logging切换到slf4j slf4j-jcl : slf4j切换到commons-logging 如果这两者共存的话,必然造成相互委托,造成内存溢出 5.2 log4j-over-slf4j 与 slf4j-log4j12 冲突 log4j-over-slf4j : log4j1切换到slf4j slf4j-log4j12 : slf4j切换到log4j1如果这两者共存的话,必然造成相互委托,造成内存溢出。但是log4j-over-slf4内部做了一个判断,可以防止造成内存溢出: 即判断slf4j-log4j12 jar包中的org.slf4j.impl.Log4jLoggerFactory是否存在,如果存在则表示冲突了,抛出异常提示用户要去掉对应的jar包,代码如下,在slf4j-log4j12 jar包的org.apache.log4j.Log4jLoggerFactory中: 5.3 jul-to-slf4j 与 slf4j-jdk14 冲突 jul-to-slf4j : jdk-logging切换到slf4j slf4j-jdk14 : slf4j切换到jdk-logging如果这两者共存的话,必然造成相互委托,造成内存溢出 6 结束语至此,这个日志系列就算终于完成了。它注重于日志系统之间的交互与集成,所以想深入研究单个日志系统的架构的话,就需要各位自行去深入研究了。 slf4j、jcl、jul、log4j1、log4j2、logback大总结的更多相关文章 Java logger组件:slf4j, jcl, jul, log4j, logback, log4j2先说结论 建议优先使用logback 或 log4j2.log4j2 不建议和 slf4j 配合使用,因为格式转换会浪费性能. 名词:jcl 和 jul 标题中的 jcl 是 apache Jakar ... 转:Java logger组件:slf4j, jcl, jul, log4j, logback, log4j2先说结论 建议优先使用logback 或 log4j2.log4j2 不建议和 slf4j 配合使用,因为格式转换会浪费性能. 名词:jcl 和 jul 标题中的 jcl 是 apache Jakar ... 3.Java日志框架slf4j、jcl、jul、log4j1、log4j2、logback大总结一.slf4j.jcl.jul.log4j1.log4j2.logback JUL:JDK中的日志记录工具,也常称为JDKLog.jdk-logging. LOG4J1:一个具体的日志实现框架. LO ... slf4j、jcl、jul、log4j1、log4j2、logback大总结[转]#1 系列目录 jdk-logging.log4j.logback日志介绍及原理 commons-logging与jdk-logging.log4j1.log4j2.logback的集成原理 slf4 ... JCL、SLF4J、Log4J、Log4J2、LogBack和JUL之间的关系,你搞清楚了吗?写在前面 日志组件是我们平时开发过程中必然会用到的组件.在系统中正确的打印日志至少有下面的这些好处: 调试:在程序的开发过程中,必然需要我们不断的调试以达到程序能正确执行的状态 .记录日志可以让开发人 ... Java 日志框架概述(slf4j / log4j / JUL / Common-logging(JCL) / logback)一.简介 JAVA日志在初期可能官方并没有提供很好且实用的规范,导致各公司或OSS作者选择自行造轮子,这也导致了目前初学者觉得市面上 Java 日志库繁杂的局面. 现在市面流行以 slf4j(Simp ... 一文讲尽门面日志slf4j和log4j、log4j2、logback依赖jar引用关系公众号Mac代码分割阅读链接 前言 之前都是使用SparkStreaming开发,最近打算学习一下Flink,就从官网下载了Flink 1.11,打算搞一个客户端,将程序提交在yarn上.因为Flin ... Slf4j与log4j及log4j2的关系及使用方法Slf4j与log4j及log4j2的关系及使用方法 slf4j slf4j仅仅是一个为Java程序提供日志输出的统一接口,并不是一个具体的日志实现方案,就比如JDBC一样,只是一种规则而已,所以单独 ... Slf4j与log4j及log4j2、logbak的关系及使用方法Slf4j与log4j及log4j2的关系及使用方法 slf4j slf4j仅仅是一个为Java程序提供日志输出的统一接口,并不是一个具体的日志实现方案,就比如JDBC一样,只是一种规则而已,所以单独 ... 随机推荐 内存映射函数remap_pfn_range学习——代码分析(3)li {list-style-type:decimal;}ol.wiz-list-level2 > li {list-style-type:lower-latin;}ol.wiz-list-le ... [ACM] HDU 2255 奔小康赚大钱 (二分图最大权匹配,KM算法)奔小康赚大钱 Problem Description 传说在遥远的地方有一个很富裕的村落,有一天,村长决定进行制度改革:又一次分配房子. 这但是一件大事,关系到人民的住房问题啊. 村里共同拥有n间房间 ... Linux学习19-gitlab配置邮箱postfix(新用户激活邮件)前言 gitlab新增新用户有两种方式,第一种可以用户主动注册(自己设置密码):第二种也可以通过root管理员用户直接添加用户,发个邮件到用户的邮箱里,收到邮件后激活. 如果是第二种方式添加新用户的话 ... Thinking in Java---异常处理机制java的异常处理机制能够使程序有极好的容错性,让程序更加的健壮.所谓的异常,就是指的阻止当前方法或作用域继续运行的问题,,当程序运行时出现异常时,系统就会自己主动生成一个Exception对象来通知 ... 犯罪现场调查第一季/全集CSI迅雷下载英文译名 CSI (第1季) (2000首播)CBS. 本季看点:赌城拉斯维加斯吸引着做发财梦的人,也吸引着形形色色的罪犯,该市警察局的犯罪现场调查局在全美国名列第二.该剧 ... windows下node.js调用batnode.js调用bat需要用到Child Processes模块 因为bat是文件,所以需要使用execFile方法 如果指定了cwd,它会切换bat执行的目录,类似cd的功能,如果未指定默认为 ... 《UNIX环境高级编程(第3版)》基本信息 原书名:Advanced Programming in the UNIX Environment (3rd Edition) (Addison ... Java多线程之Callable接口与Runnable的实现以及选择通过实现Runnable接口的实现 package Thread; import java.util.concurrent.ExecutorService;import java.util.concu ... [转]PHP之APC缓存详细介绍(学习整理)From : http://www.2cto.com/kf/201210/160140.html 1.APC缓存简介APC,全称是Alternative PHP Cache,官方翻译叫”可选PHP缓存 ... HttpAsyncClient的连接池使用代码示例 public static void main(String[] args) throws Exception { ConnectingIOReactor ioReactor = new D ... |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |